class Student:
    # 只能有一个构造方法
    # def __init__(self):{}
    #
    # def __init__(self, name):
    #     self.name = name

    '''
      类变量通常不作为实例变量使用。因为，Python的类变量，并不像java的静态变量。
      通过对象去更改类变量，并不会更改类变量原先的值。此时的类变量已经变成实例变量。
      所以，我们操作类变量，用类去操作，而非对象去操作。除非，你知道你要做什么。
      https://www.jianshu.com/p/86f27ceadfeb
    '''
    classVariable = "Python里面我称之为类变量"
    __secretCount = 0  # 私有类变量

    def __init__(self, name, age):
        self.name = name
        self.age = age
        self.__privateVariable = "我的名字是%s,年龄为：%d".format(name, age)
        self.__secretCount = 10
        print("私有类变量，只能在类中访问：" + self.__secretCount)

    # 这里使用runoob代替self，所以说，self并不是关键字
    def prt(runoob):
        print(runoob)
        print(runoob.__class__)
        print(runoob.__privateVariable)


if __name__ == '__main__':
    s1 = Student("cjf", 25)
    s1.prt()
    print(s1.age)
    print(s1.classVariable)

    s2 = Student("slf",25)

    # 通过对象去更改类变量，只有自身的类变量的值发生改变
    print("通过类去访问：" + Student.classVariable)
    s2.classVariable = "s2更改classVariable值"
    print("通过s2去访问：" + s2.classVariable)
    print(s1.classVariable)
    print("通过s1去访问：" + s1.classVariable)
    print("通过类去访问：" + Student.classVariable)
    print()

    # 通过类去重新赋值类变量，并不能更改s2的classVariable的值
    print("通过s2去访问：" + s2.classVariable)
    Student.classVariable = "通过类去重新赋值类变量，并不能更改s2的classVariable的值"
    print("通过s2去访问：" + s2.classVariable)
    print("通过s1去访问：" + s1.classVariable)
    print("通过类去访问：" + Student.classVariable)
    # 为什么这么神奇，见：https://www.cnblogs.com/duanv/p/5947525.html
